Komponenta pro zadavani datumu
Otázka od: Karel Pecinka
18. 11. 2004 16:13
Zdar,
poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni
zadavat rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se
rok, 17 bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by
ani spatny kdyby mel uzivatel i alternativni variantu rozbalit si
graficky kalendar podobne jako to ma datetimepicker, ale to uz neni tak
potreba. A kdyby ta komponenta byla rovnou db, tak by to byla uplne
parada, ale to uz bych si eventuelne pridal.
Diky za tipy.
Karel
Odpovedá: Jiri Cincura
18. 11. 2004 16:41
Karel Pecinka wrote:
> Zdar,
>
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni zadavat
> rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se rok, 17
> bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by ani spatny
A co na to pouzit TMaskEdit? Ten ti ty tecky doplni a event. i mesice, pokud
si to nastavis pri startu.
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; | http://www.cincura.net/
mailto:xcincura@informatics.muni.cz | http://photo.cincura.net/
ICQ: 314711544 | http://phorum.cincura.net/
---
And if our times are difficult and perplexing,
so are they challenging and filled with opportunity.
-Robert F. Kennedy, 1961
Odpovedá: Karel Pecinka
18. 11. 2004 16:30
MaskEdit neprovadi kontrolu zadani spravnosti datumu, napr. umozni zadat
5. 13. atd.
> A co na to pouzit TMaskEdit? Ten ti ty tecky doplni a event.
> i mesice, pokud si to nastavis pri startu.
Odpovedá: Jiri Cincura
18. 11. 2004 16:58
Karel Pecinka wrote:
> MaskEdit neprovadi kontrolu zadani spravnosti datumu, napr. umozni zadat
> 5. 13. atd.
To je pravda. Musel by sis to osefovat sam.
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; | http://www.cincura.net/
mailto:xcincura@informatics.muni.cz | http://photo.cincura.net/
ICQ: 314711544 | http://phorum.cincura.net/
---
And if our times are difficult and perplexing,
so are they challenging and filled with opportunity.
-Robert F. Kennedy, 1961
Odpovedá: hlas
18. 11. 2004 16:42
ja pouzivam klasicku komponentu dbedit a vedla je tlacitko na kalendar
mam to osetrene tak, ze ak dojde k chybnemu vstupu procedura to
osetri tak ze sa z toho pokusi urobit datum najblizsi tomu vstupu
co nenajde do plni ako now.
napr z 15 spravi 15.11.2004
z 11*10 spravi 11.10.2004
z 11u12 spravi 11.12.2004 atd
strazi to jedina procedura:
procedure THform.MyException(Sender:TObject; E:Exception);
var wRok, wMesiac, wDen, wH, wM, wS, wMS: word;
i, sepCount, Pos1, Pos2, Pos3: byte;
DateStr, TimeStr, PomS, ZalohaS, Hod, Min, Sec: String;
var ABC: String;
F: TextFile;
begin
if (E.ClassType.ClassName='EConvertError') then
begin
if Sender is TDBEdit then
begin
with Sender as TDBEdit do
begin
if DataSource.DataSet.FieldByName(DataField).DataType=ftDate then
begin
decodedate(now,wRok,wMesiac,wDen);
SepCount := 0; // pocet separatorov =0
Pos1:=0; // pozicia 1. separatora=0
Pos2:=0; // pozicia 2. separatora=0
Pos3:=0; // pozicia 3. separatora=0
DateStr:=Text; // premennna datestr obsahuje datum, ktory sa
opravi
// nasl. cyklus zameni vs.ine znaky ako cisla 0-9 za '.' ako
separator
// a poznamena pozicie prvych troch separatorov
for i := 1 to Length(DateStr) do
if not (DateStr[i] in ['0'..'9']) then
begin
DateStr[i] := '.'; //DateSeparator;
inc(SepCount);
case sepCount of
3: Pos3:=i;
2: Pos2:=i;
1: Pos1:=i;
end;
end;
// vsetko za tretim separatorom zmaze - napr 11.3.2000.xxx.xxx.xx
// vratane tretieho separatora a pocet separatorov nastavi na 2
if SepCount>2 then
begin
Delete(DateStr, Pos3-1, Length(DateStr)-Pos3+1);
SepCount:=2;
end;
// doplni chybajuce casti aktualnym mesiacom a rokom
case sepCount of
0: DateStr:=DateStr+'.'+IntToStr(wMesiac)+'.'+IntToStr(wRok);
1: begin
if Pos1<Length(DateStr) then
DateStr:=DateStr+'.'+IntToStr(wRok)
else
DateStr:=DateStr+IntToStr(wMesiac)+'.'+IntToStr(wRok);
end;
2: begin
if Pos2=Length(DateStr) then
DateStr:=DateStr+IntToStr(wRok);
if Pos2-Pos1=1 then
Insert(IntToStr(wMesiac),DateStr,Pos2);
end;
end;
// ak je iny znak na 1. mieste ako cislo tak to cele vymaze
if Pos1=1 then DateStr:='';
// vlozi vysledok do bdeditu
Text:=DateStr;
end;
end
else
begin
Application.ShowException(E); {let Delphi take it from here}
end;
end;
Odpovedá: Ludek ZITA
19. 11. 2004 3:03
On Behalf Of Karel Pecinka
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli
> umozni zadavat rychle datum z klavesnice (napr. 1710 bude
> 17.10. a doplni se rok, 17 bude 17. 10. a doplni se aktualni
> mesic a rok atd.)? Nebylo by ani spatny kdyby mel uzivatel i
> alternativni variantu rozbalit si graficky kalendar podobne
> jako to ma datetimepicker, ale to uz neni tak potreba. A
> kdyby ta komponenta byla rovnou db, tak by to byla uplne
> parada, ale to uz bych si eventuelne pridal.
Ahoj,
Mne se libi TEditSinea (viz. sada freeware komponent Sinea VCL pro
Delphi s uplnymi zdroji na www.sinea.cz)
(EditType = ttDate)
Ludek
Odpovedá: Petr Gregor
19. 11. 2004 7:49
Tady je kousek kodu, ktery resi tvorbu data v normalnim TEdit.
Doplnte si to do nejake sve komponenty.
Vystupem je datum ve formatu d.m.yyyy
Petr
try
sText := Text;
while Pos(',', sText) > 0 do //nahrad pripadne carky za tecky
begin
nPozice := Pos(',', sText);
Delete(sText,nPozice,1);
Insert('.',sText,nPozice);
end;
If Length(sText) = 1 Then
begin //v pripade ze retezec je jen jeden znak dlouhy dopln tecku a
mesic a rok
sText := sText + '.'+
IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 2) AND ( Pos('.',sText)=0) ) then
begin //v pripade ze retezec je dva znaky dlouhy a neobsahuje tecku tak
dopln tecku a mesic a rok
sText := sText + '.'+
IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date))
end
Else If ((Length(sText) = 2) AND (Pos('.',sText)>0) ) Then
begin //v pripade ze retezec je dva znaky a dlouhy a obsahuje tecku tak
dopln mesic a rok
sText := sText + IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 3) AND (Pos('.',sText)=2) ) Then
begin //v pripade ze retezec je tri znaky a dlouhy a obsahuje tecku na
druhem miste tak dopln tecku a rok
sText := sText + '.'+IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 3) AND (Pos('.',sText)=3) ) Then
begin //v pripade ze retezec je tri znaky a dlouhy a obsahuje tecku na
tretim miste tak dopln mesic a rok
sText := sText + IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 4) AND (Pos('.',sText)=3) ) Then
begin //v pripade ze retezec je ctyri znaky a dlouhy a obsahuje tecku na
tretim miste tak dopln tecku a rok
sText := sText + '.'+IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 4) AND (Pos('.',sText)=4) ) Then
begin //v pripade ze retezec je ctyri znaky a dlouhy a obsahuje tecku na
ctvrtem miste tak dopln rok
sText := sText + IntToStr(YearOf(Date));
end
Else If ((Length(sText) = 6) AND (sText[6]='.') ) Then
begin //v pripade ze retezec je sest znaku a dlouhy a obsahuje tecku na
sestem miste tak dopln rok
sText := sText + IntToStr(YearOf(Date));
end
Else If ((Length(sText) < 6) AND (Pos('.',sText)=0)) then
begin //pokud je retezec dlouhy mene nez 6 znaku a neobsahuje jednu
tecku tak dopln dnesni datum
sText := DateToStr(Date);
end
Else If ((Length(sText) < 6) AND (Pos('.',sText)> 0)) then
begin //pokud je retezec dlouhy mene nez 6 znaku a obsahuje jednu tecku
tak dopln rok
sText := sText + '.'+IntToStr(YearOf(Date));
end;
If Pos('..', sText) > 0 Then
begin //pokud doslo ke zdvojeni tecky tak to oprav
nPozice := Pos('..', sText);
Delete(sText,nPozice,1);
end;
Text := sText;
StrToDate(Text);
Except
begin
MessageDlg('Vlozeny udaj neni platnym datem. Nastavuji dnesni
datum.',mtError,
[mbOK],0);
Text := DateToStr(Date);
SetFocus;
Exit;
end;
On Behalf Of Karel Pecinka
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni
> zadavat rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se
> rok, 17 bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by
> ani spatny kdyby mel uzivatel i alternativni variantu rozbalit si
> graficky kalendar podobne jako to ma datetimepicker, ale to uz neni
> tak potreba. A kdyby ta komponenta byla rovnou db, tak by to byla
> uplne parada, ale to uz bych si eventuelne pridal.